'use strict';

const Controller = require('egg').Controller;
/**
 * @controller apiLiveController 直播间
 */
const md5 = require('md5')
class LiveController extends Controller {
  /**  
   * @summary 创建直播
   * @description 创建直播
   * @router post /api/live/save 
   * * @request cover string *cover 用户名
   * * @request title string *title 密码
   * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
   */
  async save() {
    // 结构
    let {
      app,
      ctx
    } = this
    let user_id = ctx.authUser.id
    // 参数验证
    ctx.validate({
      cover: {
        type: 'string',
        required: false,
        desc: '直播封面',

      },
      title: {
        type: 'string',
        required: true,
        desc: '直播标题'
      }
    })
    // 获取阐述
    let {
      cover,
      title
    } = ctx.request.body
    // 生成唯一的key
    let key = ctx.randomString(20)
    // 创建直播间
    let res = await app.model.Live.create({
      title,
      cover,
      user_id,
      key
    })
    // 生成签名
    let sign = this.sign(key)
    // 返回数据
    ctx.apiSuccess({
      data: res,
      sign
    })
  }
  // 生成签名
  sign(key) {
    let {
      ctx,
      app
    } = this;
    const secret = app.config.mediaServer.auth.secret
    const expire = parseInt((Date.now() + 100000000) / 1000);
    const hashValue = md5(`/live/${key}-${expire}-${secret}`);
    return `${expire}-${hashValue}`
  }

  /**  
   * @summary 更改直播间状态
   * @description 更改直播间状态
   * @router post /api/live/changestatus 
   * * @request id string *id 直播间ID
   * * @request type string *type play pause stop
   * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
   */
  async changestatus() {
    // 结构
    let {
      ctx,
      app
    } = this
    let user_id = ctx.authUser.id
    // 参数验证
    ctx.validate({
      id: {
        type: 'int',
        required: true,
        desc: '直播间ID'
      },
      type: {
        type: 'string',
        required: true,
        desc: '直播状态',
        range: ['play', 'stop', 'pause']
      }
    })
    // 获取参数
    let {
      id,
      type
    } = ctx.request.body

    // 查询直播间
    let live = await app.model.Live.findOne({
      where: {
        id,
        user_id
      }
    })
    // 判断是否存在
    if (!live) {
      return ctx.apiFail('直播不存在')
    }

    // 判断是否结束
    if (live.status === 3) {
      return ctx.apiFail('直播已结束')
    }
    // 修改状态
    let status = {
      play: 1,
      pause: 2,
      stop: 3
    }
    live.status = status[type]
    await live.save()
    // 返回ok
    ctx.apiSuccess('ok')

  }
  /**  
   * @summary 获取直播间列表
   * @description 获取直播间列表
   * @router get /api/live/list/:id 
   * * @request page string page 分页
   * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
   */
  async list() {
    // 结构
    let {
      ctx,
      app
    } = this
    // 参数验证
    ctx.validate({
      page: {
        type: 'int',
        required: true,
        desc: '分页'
      }
    })
    // 获取分页列表数据
    let rows = await ctx.page('Live')
    // 返回数据
    ctx.apiSuccess(rows)
  }

  /**  
   * @summary 查看指定直播间
   * @description 查看指定直播间
   * @router get /api/live/read/:id 
   * * @request id string *id 直播间id
   * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
   */
  async read() {
    // 结构
    let {
      ctx,
      app
    } = this
    // 参数验证
    ctx.validate({
      id: {
        type: 'int',
        desc: '直播间ID',
        required: true
      }
    })
    // 获取参数
    let {
      id
    } = ctx.params
    // 判断直播间是否结束
    // 查询直播间-关联查询用户信息
    let live = await app.model.Live.findOne({
      where: {
        id
      },
      include: [{
        model: app.model.User,
        attributes: ['username', 'avatar', 'id']
      }]
    })
    if (!live) {
      return ctx.apiFail('直播间不存在')
    }
    // 生成签名
    let sign = null
    if (live.status === 3) {
      sign = this.sign(live.key)
    }
    // 返回数据
    ctx.apiSuccess({
      data: live,
      sign
    })


  }
}

module.exports = LiveController;